using Engine;
using Game;

namespace SCIENEW {
    /// <summary>
    /// 前6位: 方块值  后12位: 损伤值
    /// </summary>
    public static class DamageableItemManager {
        public static DamageableItemBlock[] Items;

        /// <summary>
        /// 存放各种满耐久的物品ID
        /// </summary>
        public static Dictionary<string, int> IdMap;

        public static void Init() {
            Items = [
                new DrillDItem("钢钻", "SteelDrill", "钻头是自动挖掘机中最重要的部件，您应该在使用它时将其放入机器中。 提醒，采矿会损坏钻头。", Color.White, 1000),
                new DrillDItem("钻石钻", "DiamondDrill", "钻头是自动挖掘机中最重要的部件，您应该在使用它时将其放入机器中。 提醒，采矿会损坏钻头。", Color.Cyan, 2000),
                new TubularisDItem("铁管", "IronTubularis", "输液管是液体泵中最重要的部分，您应该在使用它时将其放入机器中。 提醒，泵送岩浆会损坏输液管。", Color.White, 700),
                new TubularisDItem("钢管", "SteelTubularis", "输液管是液体泵中最重要的部分，您应该在使用它时将其放入机器中。 提醒，泵送岩浆会损坏输液管。", Color.Gray, 1100),
            ];

            IdMap = new Dictionary<string, int>();
            int index = 0;
            foreach (var itemBlock in Items) {
                int blockData = index & 0b111111;
                int blockValue = Terrain.MakeBlockValue(BaseDamageableItemBlock.Index, 0, blockData);
                IdMap.Add(itemBlock.GetCraftingId(), blockValue);
                index++;
            }
        }

        /// <summary>
        /// 通过方块完整值获取对应类的实例
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static DamageableItemBlock GetItem(int value) {
            int index = Terrain.ExtractData(value) & 0b111111;
            if(index < Items.Length) return Items[index];
            return Items[0];
        }

        public static int GetItemID(string id) => IdMap[id];

        /// <summary>
        /// 通过物品数字ID获取物品字符串ID
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static string GetItemCraftingID(int value) => GetItem(value).GetCraftingId();

        /// <summary>
        /// 获取损伤值
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static int GetDamage(int value) => Terrain.ExtractData(value) >> 6;

        /// <summary>
        /// 设置某个物品的损伤值
        /// </summary>
        /// <param name="value"></param>
        /// <param name="damage"></param>
        /// <returns></returns>
        public static int SetDamage(int value, int damage) => Terrain.ReplaceData(value, (Terrain.ExtractData(value) & 0b111111) | (damage << 6));
    }
}